var playergrid = [];
var aigrid = [];

var gridy = 10, gridx = 10;
var preloaded = [];
var toplace = 20, aiplace = 20;
var mylives = 20, ailives = 20;
var difficulty = 20, aimiss = 0;
var name = "";

var shiptypes = [["Minesweeper",2,2],["Frigate",3,1],[ "Cruiser",4,2],[ "Battleship",5,1]];
	
function init(){
	
	name = document.login.nickname.value;
	difficulty = document.login.difficulty.value;
	$("#login").hide();
	$("#spielfeld").show();
	$("#nametag").html(name + "'s Flotte");
	//document.getElementById("login").style.display = "none";
	//document.getElementById("spielfeld").style.display = "inline";
	//document.getElementById("nametag").innerHTML = name + "'s Flotte";
	
	drawGrid(true);
	drawGrid(false);	
	
	var y,x;
	for(x=0;x<gridx;x++){
		playergrid[x] = [gridx];
		aigrid[x] = [gridx];
		for(y=0;y<gridy;y++){
			playergrid[x][y] = [false,false]; // [hatSchiff, wurdeBeschossen]
			aigrid[x][y] = [false,false];
		}
	}
	
	//setzen der ai schiffe

	for (var s = 0; s < shiptypes.length; s++) {//schleife ueber schiffsarten
			for (var i = 0; i < shiptypes[s][2]; i++) {// schleife ueber anzahl der aktuellen schiffsart
				var direction = Math.floor(Math.random() * 2); // richtung
				var len = shiptypes[s][1], x, y, dx=0, dy=0;
				var shiptobeplaced = true;
				while(shiptobeplaced){
					direction = Math.floor(Math.random() * 2); // richtung
					if(direction == 0){
						x = Math.floor(Math.random() * (gridx-len));
						y = Math.floor(Math.random() * gridy);
						dx=1;
						dy=0;
					} else {
						x = Math.floor(Math.random() * gridx);
						y = Math.floor(Math.random() * (gridy-len));
						dy=1;
						dx=0;
					}
					 
					if(checkArea(x,y,len,direction)){
						//schiff platzieren
						for(var k=0; k<len; k++){
							aigrid[x+(k*dx)][y+(k*dy)][0] = true;
							//das image gleich belassen, nur das grid ist wichtig, hier zu testzwecken
							//document.images["pc" + (x+(k*dx)) + "_" + (y+(k*dy))].src = "images/schiffplatz.png";
							shiptobeplaced = false;
						}
					}
				}
			}
		}
	}

	//ausgemusterte funktion
	function aiPlaceShip(x, y) { //umschreiben damit gezielt richtige schiffsarten gesetzt werden, 
		if (aigrid[x][y][0] == false) {
			aigrid[x][y][0] = true;
			if (checkPlacement()) {
				//das image gleich belassen, nur das grid ist wichtig, hier zu testzwecken
				document.images["pc" + x + "_" + y].src = "images/schiffplatz.png";
				aiplace--;
			} else {
				aigrid[x][y][0] = false;
			}
		}
	}
	
	//ueberprueft ob das gebiet von punkt x/y aus fuer ein schiff mit gegebener laenge in entsprechende Richtung ausreicht
	function checkArea(x,y,length,direction){
		//setzte delta x und delta y, abhaengig von der richtung, eines ist 3, anderes ist length +2
		var dx=0, dy=0;
		if(direction == 0){
			dx = length;
			dy = 1;
		} else {
			dx = 1;
			dy = length;
		}
		
		//durchlaufe zwei schleifen um das feld der groesse 3 * (length+2) zu ueberpruefen
		for(var i = x-1; i <= (x+dx); i++ ){
			for(var j = y-1; j<=(y+dy); j++){
				var inrange = Boolean((i < 10) && (i >= 0) && (j >= 0) && (j < 10));
				if(inrange){
					if(aigrid[i][j][0] == true) return false;
				}
			}
		}
		return true;
	}

	function replaceShips(isPlayer) {
		//suche nach dem erten schiffteil das du findest
		//pruefe in welche richtung das naechste teil liegt BESSER: pruefe wie in checkplacement, gehe reihe durch, mehr als 1 teil nacheinander, setzte grafik ein
		//setzte schiffkopf
		//pruefe ob naechtest teil das letzte
		// wenn ja, schiffende, wenn nein mittelteil, wiederhole bis schiffsende, markiere als bereits durchlaufen
		//suche naechsten schiffskopf
		var x, y, grid, imageprefix;
		if(isPlayer) {
			grid = playergrid;
			imageprefix = "ply";
		} else {
			grid = aigrid;
			imageprefix = "pc";
		}
		for (y = 0; y < gridy; y++) {
			for (x = 0; x < gridx; x++) {
				var before = Boolean(x-1 >= 0 && grid[x-1][y][0] == true);
				var current = Boolean(grid[x][y][0] == true);
				var after = Boolean(x+1 < 10 && grid[x+1][y][0] == true);
					
				if(before && current && after){
					document.images[imageprefix + x + "_" + y].src = "images/schiff_mitte_vertical.png"; //mitte vom schiff
				} else if(before && current){
					document.images[imageprefix + x + "_" + y].src = "images/schiff_rumpf_vertical.png"; //ende vom schiff
				} else if(current && after){
					document.images[imageprefix + x + "_" + y].src = "images/schiff_vorne_vertical.png"; //anfang vom schiff
				}
			}
		}
		
		for (x = 0; x < gridx; x++) {
			for (y = 0; y < gridy; y++) {
				var before = Boolean(y-1 >= 0 && grid[x][y-1][0] == true);
				var current = Boolean(grid[x][y][0] == true);
				var after = Boolean(y+1 < 10 && grid[x][y+1][0] == true);
					
				if(before && current && after){
					document.images[imageprefix + x + "_" + y].src = "images/schiff_mitte_horizontal.png"; //mitte vom schiff
				} else if(before && current){
					document.images[imageprefix + x + "_" + y].src = "images/schiff_vorne_horizontal.png"; //anfang vom schiff
				} else if(current && after){
					document.images[imageprefix + x + "_" + y].src = "images/schiff_rumpf_horizontal.png"; //ende vom schiff
				}
			}
		}
	}

	//zahlen aendern
	function drawGrid(isPlayer) {
		var y, x;
		var grid = "";
		for (y = 0; y < gridy; ++y) {
			for (x = 0; x < gridx; ++x) {
				if (isPlayer) {
					grid += '<a href="javascript:placeShip('+y+ ','+x
					+');"><img name="ply'+y+'_'+x+'" src="images/wasser.png" width=40 height=40></a>';
				} else {
					grid += '<a href="javascript:gridClick('+ y+','+x
					+');"><img name="pc'+y+'_'+x+'" src="images/wasser.png" width=40 height=40></a>';
				}
			}
			grid += '<br>';
		}
		
		if(isPlayer){
			document.getElementById("playergrid").innerHTML = grid;
		} else {
			document.getElementById("aigrid").innerHTML = grid;
		}
	}

	function placeShip(x, y) {
		if (toplace > 0) {
			if (playergrid[x][y][0] == true) {
				playergrid[x][y][0] = false;
				document.images["ply" + x + "_" + y].src = "images/wasser.png";
				toplace++;
				document.getElementById("status").innerHTML = "Entferne Schiff von "+ x+ "/"+ y+ ". Noch "+ toplace+ " Schiffteile ueber";
			} else {
				playergrid[x][y][0] = true;
				if (checkPlacement()) {
					document.images["ply" + x + "_" + y].src = "images/schiffplatz.png";
					toplace--;
					if(toplace>0){
					document.getElementById("status").innerHTML = "Platziere Schiff an "+ x+ "/"+ y+ ". Noch "+ toplace+ " Schiffteile ueber";
					} else {
						document.getElementById("status").innerHTML = "Alle Schiffe sind platziert, das Spiel beginnt!";
						replaceShips(true);
					}
				} else {
					playergrid[x][y][0] = false;
					document.getElementById("status").innerHTML = "Ungueltige Platzierung!";
				}
			}
		} else {
			document.getElementById("status").innerHTML = "Du bist am Zug, greife deinen Gegner an!";
			//Alles schiffe platziert, andere statusnachricht anzeigen
		}
	}

	function gridClick(x, y) {
		if (toplace > 0) {
			document.getElementById("status").innerHTML = "Sie muessen noch "
					+ toplace + " Schiffe platzieren!";
		} else {
			//auswerten ob getroffen wurde

			if (aigrid[x][y][1] == true) {
				// wurde bereits getroffen
				document.getElementById("status").innerHTML = "Hier hast du bereits hingeschossen!";
			} else {
				aigrid[x][y][1] = true; //feld wurde beschossen
				if (aigrid[x][y][0] == true) {
					//treffer, ai verliert ein leben
					document.getElementById("status").innerHTML = "Gratuliere, du hast ein feindliches Schiff getroffen!";
					document.images["pc" + x + "_" + y].src = "images/totenkopf.png";
					ailives--;
				} else {
					//fehlschuss
					document.getElementById("status").innerHTML = "Daneben du Flasche!";
					document.images["pc" + x + "_" + y].src = "images/explosion.png";
				}
				if (ailives > 0) {
					aiMove();
				} else {
					//spieler hat gewonnen
					alert("Gratuliere! Du hast den Gegner besiegt.");
					window.location = "aigame.jsp";
				}
			}
		}
	}

	function checkPlacement() {
		// hier ueberpruefen ob das grid gueltige schiffe enthaelt

		// es duerfen keine vertikalen platzierungen vorkommen
		var x, y;
		for (y = 0; y < gridy - 1; y++) {
			for (x = 0; x < gridx - 1; x++) {
					if (playergrid[x][y][0] == true	&& playergrid[x + 1][y + 1][0] == true)	return false;
					if (playergrid[x + 1][y][0] == true && playergrid[x][y + 1][0] == true) return false;
			}
		}
		//maximale schifflaenge?

		//finale platzierung, sind die richtigen schiffsarten vorhanden
		if (toplace == 1) {
			//schiffe koennen nicht direkt nebeneinander sitzen, also kann einfach jede reihe und jede spalte 
			//einmal durchgegangen werden und entsprechende schiffstypen abgehakt werden , hier die anzahl -1, 
			//sind am ende nicht alle schiffsanzahlen 0 gibt es einen fehler
			var shiptypes = [["Minesweeper",2,2],["Frigate",3,1],[ "Cruiser",4,2],[ "Battleship",5,1]];
			var x, y, shiplength;
			
			//durchlauf in x richtung
			for (y = 0; y < gridy; y++) {
				shiplength = 0;
				for (x = 0; x < gridx; x++) {
					if(playergrid[x][y][0] == true){
						shiplength++;
					} else {
						if(shiplength < 2){
							shiplength = 0; // vielleicht ein schiff gefunden, dieses hat aber andere richtung	
						} else {
							shiptypes[shiplength-2][2] -= 1; // reduziere schifssanzahl um 1
							shiplength = 0; //beginne von vorne
						}
					}
				}//noch einmal am ende der schleife weil sonst nicht richtig ueberprueft wird
				if(shiplength < 2){
					shiplength = 0; // vielleicht ein schiff gefunden, dieses hat aber andere richtung	
				} else {
					shiptypes[shiplength-2][2] -= 1; // reduziere schifssanzahl um 1
					shiplength = 0; //beginne von vorne
				}
			}
			
			//durchlauf in y richtung
			for (x = 0; x < gridx; x++) {
				shiplength = 0;
				for (y = 0; y < gridy; y++) {
					if(playergrid[x][y][0] == true){
						shiplength++;
					} else {
						if(shiplength < 2){
							shiplength = 0; // vielleicht ein schiff gefunden, dieses hat aber andere richtung	
						} else {
							shiptypes[shiplength-2][2] -= 1; // reduziere schifssanzahl um 1
							shiplength = 0; //beginne von vorne
						}
					}
				}
				if(shiplength < 2){
					shiplength = 0; // vielleicht ein schiff gefunden, dieses hat aber andere richtung	
				} else {
					shiptypes[shiplength-2][2] -= 1; // reduziere schifssanzahl um 1
					shiplength = 0; //beginne von vorne
				}
			}
			
			if(shiptypes[0][2] != 0 || shiptypes[1][2] != 0 || shiptypes[2][2] != 0 || shiptypes[3][2] != 0) return false;
		}

		return true;
	}

	function aiMove() {
		var moving = true;
		var x,y;
		while(moving){
			x = Math.floor(Math.random() * gridx);
			y = Math.floor(Math.random() * gridy);
			if(aimiss <= difficulty){
				//treffer oder nicht, zug zaehlt
				if(playergrid[x][y][1] == false){
					playergrid[x][y][1]	= true;
					if(playergrid[x][y][0] == false){
						//daneben
						aimiss++;
						document.images["ply" + x + "_" + y].src = "images/explosion.png";
					} else {
						//treffer
						document.images["ply" + x + "_" + y].src = "images/totenkopf.png";
						mylives--;
					}
					moving = false;
				}
			} else {
				//definitiver treffer
				if(playergrid[x][y][1] == false){
					playergrid[x][y][1]	= true;
					if(playergrid[x][y][0] == true){
						//treffer
						document.images["ply" + x + "_" + y].src = "images/totenkopf.png";
						mylives--;
						moving = false;
					}
				}
			}
		}
		if(mylives < 1){
			//spieler hat verloren
			replaceShips(false);
			alert("Der Computer hat dich besiegt, Loser!");
			window.location = "aigame.jsp";
		}
	}